home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / mus / play / tracker_4_31.lzh / tracker / Arch / NeXT / audio.c next >
C/C++ Source or Header  |  1995-03-16  |  4KB  |  195 lines

  1. /* NeXT/audio.c 
  2.     vi:ts=3 sw=3:
  3.  */
  4.  
  5. /* $Id: audio.c,v 1.9 1995/03/17 00:31:13 espie Exp espie $
  6.  * $Log: audio.c,v $
  7.  * Revision 1.9  1995/03/17  00:31:13  espie
  8.  * Added linear 8 to NeXt audio.
  9.  *
  10.  * Revision 1.8  1995/02/27  14:25:37  espie
  11.  * Rolf Grossmann patch.
  12.  *
  13.  * Revision 1.7  1995/02/23  22:41:45  espie
  14.  * Added # of bits.
  15.  *
  16.  * Revision 1.6  1995/02/23  17:03:14  espie
  17.  * Continuing changes for a standard file.
  18.  *
  19.  * Revision 1.5  1995/02/23  16:42:27  espie
  20.  * Began conversion to `common' model.
  21.  *
  22.  * Revision 1.4  1995/02/23  13:52:30  espie
  23.  * primary, secondary -> primary+secondary, primary-secondary
  24.  * strike out 2 multiplications out of 4 !
  25.  *
  26.  * Revision 1.3  1995/02/21  17:57:55  espie
  27.  * Internal problem: RCS not working.
  28.  *
  29.  * Revision 1.2  1995/02/08  13:16:22  espie
  30.  * *** empty log message ***
  31.  *
  32.  * Revision 1.1  1995/02/01  16:43:47  espie
  33.  * Initial revision
  34.  *
  35.  */
  36.  
  37. #include "defs.h"
  38. #include <sound/sound.h>
  39. #include "extern.h"
  40.  
  41. ID("$Id: audio.c,v 1.9 1995/03/17 00:31:13 espie Exp espie $")
  42.  
  43. #define DEFAULT_BUFFERS
  44. #define DEFAULT_SET_MIX
  45. #define NEW_OUTPUT_SAMPLES_AWARE
  46.  
  47. #include "Arch/common.c"
  48.  
  49.  
  50. #define SND_PLAY_PRIO   5
  51.  
  52. LOCAL SNDSoundStruct ainfo;
  53. LOCAL struct {
  54.     SNDSoundStruct snd;
  55.     char data;
  56. } *snd;
  57. LOCAL int tag;
  58. unsigned int play_ahead;
  59.  
  60. LOCAL int dsize;
  61. #define DATASIZE 40960 /* 176400 */
  62.  
  63. int
  64. open_audio(int f, int s)
  65.     {
  66.     static int possible[] = { 8012, 22050, 44100, 0};
  67.  
  68.     f = best_frequency(f, possible, 22050);
  69.  
  70.    stereo = s;
  71.    ainfo.samplingRate = f;
  72.    if (stereo)
  73.         ainfo.channelCount = 2;
  74.    else
  75.         ainfo.channelCount = 1;
  76.    if(f!=8012)
  77.         {
  78.         ainfo.dataFormat = SND_FORMAT_LINEAR_16;
  79.         dsize = 2;
  80.         }
  81.    else
  82.         {
  83.         ainfo.dataFormat = SND_FORMAT_MULAW_8;
  84.         dsize = 1;
  85.         if (stereo)
  86.             notice("Warning: Your hardware may not be fast enough \
  87. for mulaw-stereo.");
  88.         }
  89.     
  90.    idx = 0;
  91.    if (SNDAlloc((SNDSoundStruct **)&snd, DATASIZE, ainfo.dataFormat,
  92.             ainfo.samplingRate, ainfo.channelCount, 4))
  93.         end_all("Sound allocation error.");
  94.     
  95.    buffer = &snd->data;
  96.    buffer16 = (short *)&snd->data;
  97.     samples_max = DATASIZE/dsize;
  98.    tag = 1;
  99.    play_ahead = 5;
  100.    return f;
  101.     }
  102.  
  103. void
  104. set_synchro(int s)
  105.     { /* not implemented */
  106.     }
  107.  
  108. int
  109. update_frequency()
  110.     { /* frequency can't change */
  111.    return 0;
  112.     }
  113.  
  114. LOCAL void
  115. actually_flush_buffer(void)
  116.     {
  117.    if (tag > play_ahead)
  118.         SNDWait(tag-play_ahead);
  119.    if (ainfo.dataFormat == SND_FORMAT_LINEAR_16)
  120.        SNDSwapSoundToHost(&snd->data, &snd->data, samples_max, 1,
  121.               SND_FORMAT_LINEAR_16);
  122.    if (SNDStartPlaying(&snd->snd, tag++, SND_PLAY_PRIO, 0,
  123.             NULL, (SNDNotificationFun)SNDFree))
  124.         notice("Sound playing error.");    /* ### end_all? */
  125.  
  126.    idx = 0;
  127.    if (SNDAlloc((SNDSoundStruct **)&snd, DATASIZE, ainfo.dataFormat,
  128.             ainfo.samplingRate, ainfo.channelCount, 4))
  129.         end_all("Sound allocation error.");
  130.    buffer = &snd->data;
  131.    buffer16 = (short *)&snd->data;
  132.     }
  133.  
  134. void
  135. output_samples(int left, int right, int n)
  136.     {
  137.     switch(ainfo.dataFormat)
  138.         {
  139.     case SND_FORMAT_LINEAR_16:
  140.         add_samples16(left, right, n);
  141.         break;
  142.     case SND_FORMAT_LINEAR_8:
  143.         add_samples8(left, right, n);
  144.         break;
  145.     case SND_FORMAT_MULAW_8:
  146.         if (stereo)
  147.             {                /* stuff to fix (size of data) right there */
  148.             if (pms[n] == pps[n])
  149.                 {
  150.                 buffer[idx++] = SNDMulaw(left/65536);
  151.                 buffer[idx++] = SNDMulaw(right/65536);
  152.                 }
  153.             else
  154.                 {
  155.                 int s1, s2;
  156.  
  157.                 s1 = (left+right)*pps[n];
  158.                 s2 = (left-right)*pms[n];
  159.  
  160.                 buffer[idx++] = SNDMulaw((s1+s2)/65536);
  161.                 buffer[idx++] = SNDMulaw((s1-s2)/65536);
  162.                 }
  163.             }
  164.         else
  165.             buffer[idx++] = SNDMulaw((left + right)/256);
  166.         break;
  167.     default:
  168.         end_all("Error: unknown output format");
  169.         }
  170.     if (idx >= samples_max)
  171.         actually_flush_buffer();
  172.     }
  173.  
  174. void 
  175. flush_buffer(void)
  176.     {
  177.     /* dummy call on the NeXt, not enough data */
  178.     }
  179.  
  180. void
  181. discard_buffer(void)
  182.     {
  183.    int i;
  184.     
  185.    for(i=1; i<=play_ahead; i++)
  186.         SNDStop(tag-i);
  187.     }
  188.  
  189. void
  190. close_audio(void)
  191.     {
  192.    SNDFree(&snd->snd);
  193.    SNDWait(0);
  194.     }
  195.